package com.googlecode.jtoy.patterns.facade;

/**
 * 门面模式
 * 
 * GOF《设计模式》一书对Facade模式是这样描述的:
 * 　　为子系统中的一组接口提供一个统一接口。Facade模式定义了一个更高层的接口，使子系统更加容易使用。
 * 　　大致意思是说：使用一种比原有方式更简单的办法与系统交互。例如，我们把一个很重要的文件，放在了第二抽屉里，而第二个抽屉的钥匙放在了第一个抽屉里，我们要想取出这个文件，
 * 第一步肯定要拿到第一个抽屉的钥匙，然后打开它再拿出第二个抽屉的钥匙，最后打开第二个抽屉取出文件。
 * 
 * @author shangxj
 * @date Jun 19, 2011 5:20:51 PM
 */
public class Facade {

	private KeysDrawer keysDrawer;
	private FilesDrawer filesDrawer;

	public Facade() {

		this.keysDrawer = new KeysDrawer();
		this.filesDrawer = new FilesDrawer();
	}

	public Object getFile() {

		Object file = null;

		// 1.先打开装钥匙的抽屉
		keysDrawer.open();
		// 2.是否真的打开了
		if (keysDrawer.isOpen()) {

			// 3.取钥匙
			Integer key = keysDrawer.getKey("filesDrawer");
			// 4.如果取到钥匙了
			if (key != null) {

				// 5.用取到的钥匙打开装文件的抽屉
				filesDrawer.open(key);
				// 6.是否真的打开了
				if (filesDrawer.isOpen()) {
					
					// 7.取文件
					file = filesDrawer.getFile();
					// 8.关闭装文件的抽屉
					filesDrawer.close();

					// 9.放回钥匙
					keysDrawer.putKey(key);
					// 10.关闭装钥匙的抽屉
					keysDrawer.close();
				}
			}
		}

		return file;
	}
}
